/**
 * @file lv_port_indev_templ.c
 *
 */



/*********************
 *      INCLUDES
 *********************/
#include "lv_port_indev_template.h"
#include "lvgl.h"
// 触摸屏幕
#include "Inf_FT5x16.h"

/*********************
 *      DEFINES
 *********************/

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);




/**********************
 *  STATIC VARIABLES
 **********************/
lv_indev_t * indev_touchpad;
lv_indev_t * indev_mouse;
lv_indev_t * indev_keypad;
lv_indev_t * indev_encoder;
lv_indev_t * indev_button;

static int32_t encoder_diff;
static lv_indev_state_t encoder_state;

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

/**
 * @brief 初始化 LVGL 输入设备，主要针对触摸板输入设备进行初始化和注册。
 *
 * 该函数会调用触摸板初始化函数，然后配置输入设备驱动，
 * 并将触摸板作为指针类型的输入设备注册到 LVGL 系统中。
 */
void lv_port_indev_init(void)
{
    // 使用触摸方案
    // 定义一个静态的输入设备驱动结构体，用于配置触摸板输入设备
    static lv_indev_drv_t indev_drv;

    // 调用触摸板初始化函数，进行触摸板硬件的初始化操作
    touchpad_init();

    /*Register a touchpad input device*/
    // 初始化输入设备驱动结构体，设置默认值
    lv_indev_drv_init(&indev_drv);

    // 设置输入设备的类型为指针类型，表明这是一个类似鼠标或触摸板的定位设备
    indev_drv.type = LV_INDEV_TYPE_POINTER;

    // 指定输入设备的数据读取回调函数，当 LVGL 需要读取触摸板数据时会调用此函数
    indev_drv.read_cb = touchpad_read;

    // 将配置好的输入设备驱动注册到 LVGL 系统中，并返回对应的输入设备句柄
    indev_touchpad = lv_indev_drv_register(&indev_drv);
}

/**********************
 *   STATIC FUNCTIONS
 **********************/

/*------------------
 * Touchpad
 * -----------------*/

/*Initialize your touchpad*/
// 自己触摸板初始化
static void touchpad_init(void)
{
    /*Your code comes here*/
    Inf_FT5x16_Init();
}

/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    /*Save the pressed coordinates and the state*/
    if(touchpad_is_pressed()) {
        touchpad_get_xy(&last_x, &last_y);
        data->state = LV_INDEV_STATE_PR;
    }
    else {
        data->state = LV_INDEV_STATE_REL;
    }

    /*Set the last pressed coordinates*/
    data->point.x = last_x;
    data->point.y = last_y;
}

/**
 * @brief 判断触摸是否按下

 * @return
 */
static bool touchpad_is_pressed(void)
{
    // 触摸板按下后
    if(Inf_FT5x16_IsPressed() == 1){
      return true;
    }
    return false;
}

/**
 * @brief 获取触摸坐标
 * @param x
 * @param y
 */
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
    Inf_FT5x16_ReadXY((uint16_t *)x, (uint16_t *)y);
}
